package model

import (
	"ginblog/errmsg"
	"github.com/jinzhu/gorm"
)

// CateGory 分类模型
type CateGory struct {
	ID   uint   `gorm:"primary_key;auto_increment" json:"id"`
	Name string `gorm:"type:varchar(20);not null" json:"name"`
}

// CheckCategory  检查分类是否存在
func CheckCategory(name string) int {
	var category CateGory
	Db.Where("name=?", name).First(&category)
	if category.Name == name {
		return errmsg.ERROR_CATENAME_USED
	}
	return errmsg.ERROR_CATE_NOT_EXIST
}

// CreateCategory 添加分类 返回一个code ，根据code去errmsg得到对应的数值
func CreateCategory(data *CateGory) int {
	err := Db.Create(&data).Error
	if err != nil {
		return errmsg.ERROR_CATENAME_USED
	}
	return errmsg.ERROR_CATE_NOT_EXIST
}

// ViewByCategory 查看单个分类
func ViewByCategory(id int, data *CateGory) int {
	Err = Db.Where("id=?", id).Find(&data, id).Error
	if Err != nil {
		return errmsg.ERROR_CATE_NOT_EXIST
	}
	if int(data.ID) == id {
		return errmsg.SUCCESS
	}
	return errmsg.SUCCESS
}

// GetCategory 查询分类
func GetCategory(pageSize int, pageNum int) ([]CateGory, int) {
	var users []CateGory
	var total int
	//实现分页，防止一次性查询的数据过多导致数据库宕机
	Err = Db.Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users).Count(&total).Error
	if Err != nil && Err != gorm.ErrRecordNotFound {
		return nil, 0
	}
	return users, total
}

// UpdateCategory 更新用户 不包含修改密码  修改密码需要进行验证 可以单独写一个
func UpdateCategory(id int, data *CateGory) int {
	var user CateGory
	var maps = make(map[string]interface{})
	//因为gorm中更新结构体类型数据时，这个Updates会不更新那些值为初始值，我们定义的role恰好是0和1，所以如果使用struct方法更新，则会更新失败
	//因此在这里定义了变量maps，采用map方法更新，解决role这个更新问题
	maps["name"] = data.Name
	Err = Db.Model(&user).Where("id=?", id).Updates(maps).Error
	if Err != nil {
		return errmsg.ERROR_CATE_NOT_EXIST
	}
	return errmsg.SUCCESS
}

// DelCategory  删除分类
func DelCategory(id int) int {
	Err = Db.Where("id=?", id).Delete(&CateGory{}).Error //软删除
	if Err != nil {
		return errmsg.ERROR_CATE_NOT_EXIST
	}
	return errmsg.SUCCESS
}
